Skip to content

chore: update sql problems #1814

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
286 changes: 248 additions & 38 deletions run_format.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,246 @@
import re
import black

suffixes = ['md', 'py', 'java', 'c', 'cpp', 'go', 'php', 'cs', 'rs', 'js', 'ts']
suffixes = ["md", "py", "java", "c", "cpp", "go", "php", "cs", "rs", "js", "ts", "sql"]

code_blocks = ['python', 'java', 'cpp', 'c', 'go', 'ts', 'js', 'php', 'cs', 'rs']
code_blocks = ["python", "java", "cpp", "c", "go", "ts", "js", "php", "cs", "rs", "sql"]

functions_to_replace = [
"ABS",
"ACOS",
"ADDDATE",
"ADDTIME",
"AES_DECRYPT",
"AES_ENCRYPT",
"ASCII",
"ASIN",
"ATAN",
"AVG",
"BIN",
"BIT_COUNT",
"CEIL",
"CHAR",
"CHAR_LENGTH",
"CHARACTER_LENGTH",
"CONCAT",
"CONCAT_WS",
"CONNECTION_ID",
"CONV",
"CONVERT",
"COS",
"COT",
"COUNT",
"CRC32",
"CURDATE",
"CURRENT_DATE",
"CURRENT_TIME",
"CURRENT_TIMESTAMP",
"CURTIME",
"DATABASE",
"DATE",
"DATEDIFF",
"DATE_ADD",
"DATE_FORMAT",
"DATE_SUB",
"DAY",
"DAYNAME",
"DAYOFMONTH",
"DAYOFWEEK",
"DAYOFYEAR",
"DECODE",
"DEFAULT",
"DEGREES",
"DES_DECRYPT",
"DES_ENCRYPT",
"ELT",
"ENCODE",
"ENCRYPT",
"EXP",
"EXPORT_SET",
"EXTRACT",
"FIELD",
"FIND_IN_SET",
"FLOOR",
"FORMAT",
"FOUND_ROWS",
"FROM_DAYS",
"FROM_UNIXTIME",
"GET_FORMAT",
"GET_LOCK",
"GREATEST",
"GROUP_CONCAT",
"HEX",
"HOUR",
"IF",
"IFNULL",
"IN",
"INET_ATON",
"INET_NTOA",
"INSERT",
"INSTR",
"INTERVAL",
"ISNULL",
"LAST_INSERT_ID",
"LCASE",
"LEAST",
"LEFT",
"LENGTH",
"LN",
"LOAD_FILE",
"LOCALTIME",
"LOCALTIMESTAMP",
"LOCATE",
"LOG",
"LOG10",
"LOG2",
"LOWER",
"LPAD",
"LTRIM",
"MAKE_SET",
"MAKEDATE",
"MAKETIME",
"MATCH",
"MAX",
"MD5",
"MICROSECOND",
"MID",
"MIN",
"MINUTE",
"MOD",
"MONTH",
"MONTHNAME",
"NAME_CONST",
"NOW",
"NULLIF",
"OCT",
"OCTET_LENGTH",
"ORD",
"PASSWORD",
"PERIOD_ADD",
"PERIOD_DIFF",
"PI",
"POSITION",
"POW",
"POWER",
"PROCEDURE ANALYSE",
"QUARTER",
"QUOTE",
"RADIANS",
"RAND",
"RELEASE_LOCK",
"REPEAT",
"REPLACE",
"REVERSE",
"RIGHT",
"ROUND",
"ROW_COUNT",
"RPAD",
"RTRIM",
"SCHEMA",
"SEC_TO_TIME",
"SECOND",
"SESSION_USER",
"SHA1",
"SHA",
"SIGN",
"SIN",
"SLEEP",
"SOUNDEX",
"SPACE",
"SQRT",
"STR_TO_DATE",
"STRCMP",
"SUBDATE",
"SUBSTR",
"SUBSTRING",
"SUBSTRING_INDEX",
"SUBTIME",
"SUM",
"SYSDATE",
"SYSTEM_USER",
"TAN",
"TIME",
"TIMEDIFF",
"TIMESTAMP",
"TIMESTAMPADD",
"TIMESTAMPDIFF",
"TIME_FORMAT",
"TIME_TO_SEC",
"TO_DAYS",
"TRIM",
"TRUNCATE",
"UCASE",
"UNCOMPRESS",
"UNCOMPRESSED_LENGTH",
"UNHEX",
"UNIX_TIMESTAMP",
"UPPER",
"USER",
"UTC_DATE",
"UTC_TIME",
"UTC_TIMESTAMP",
"UUID",
"VAR_POP",
"VAR_SAMP",
"VARIANCE",
"VERSION",
"WEEK",
"WEEKDAY",
"WEEKOFYEAR",
"XOR",
"YEAR",
"YEARWEEK",
"ROW_NUMBER",
"RANK",
"DENSE_RANK",
"NTILE",
"LAG",
"LEAD",
"FIRST_VALUE",
"LAST_VALUE",
"CUME_DIST",
"PERCENT_RANK",
"PERCENTILE_CONT",
"PERCENTILE_DISC",
]


def add_header(path: str):
"""Add header to php and go files"""
print(f'[add header] path: {path}')
with open(path, 'r', encoding='utf-8') as f:
print(f"[add header] path: {path}")
with open(path, "r", encoding="utf-8") as f:
content = f.read()
if path.endswith('.php'):
content = '<?php\n' + content
elif path.endswith('.go') and 'sorting' not in path:
content = 'package main\n' + content
if path.endswith(".php"):
content = "<?php\n" + content
elif path.endswith(".go") and "sorting" not in path:
content = "package main\n" + content
elif path.endswith(".sql"):
for func in functions_to_replace:
pattern = r"\b{}\s*\(".format(func)
content = re.sub(pattern, f"{func.upper()}(", content, flags=re.IGNORECASE)
else:
return
with open(path, 'w', encoding='utf-8') as f:
with open(path, "w", encoding="utf-8") as f:
f.write(content)


def remove_header(path: str):
"""Remove header from php and go files"""
print(f'[remove header] path: {path}')
with open(path, 'r', encoding='utf-8') as f:
print(f"[remove header] path: {path}")
with open(path, "r", encoding="utf-8") as f:
content = f.read()
if path.endswith('.php'):
if path.endswith(".php"):
content = content.rstrip()
content = content.replace('<?php\n', '')
elif path.endswith('.go'):
content = content.replace("<?php\n", "")
elif path.endswith(".go"):
content = content.rstrip()
if 'sorting' not in path:
content = content.replace('package main\n\n', '').replace(
'package main\n', ''
if "sorting" not in path:
content = content.replace("package main\n\n", "").replace(
"package main\n", ""
)
else:
return
with open(path, 'w', encoding='utf-8') as f:
with open(path, "w", encoding="utf-8") as f:
f.write(content)


Expand All @@ -49,51 +252,58 @@ def find_all_paths() -> List[str]:
paths = []
for root, _, files in os.walk(os.getcwd()):
for file in files:
path = root + '/' + file
if 'node_modules' in path or '__pycache__' in path or '.git' in path:
path = root + "/" + file
if "node_modules" in path or "__pycache__" in path or ".git" in path:
continue
if any(path.endswith(f'.{suf}') for suf in suffixes):
if any(path.endswith(f".{suf}") for suf in suffixes):
paths.append(path)
return paths


def format_inline_code(path: str):
"""Format inline code in .md file"""
if not path.endswith('.md'):
if not path.endswith(".md"):
return
with open(path, 'r', encoding='utf-8') as f:
with open(path, "r", encoding="utf-8") as f:
content = f.read()
root = path[: path.rfind('/')]
print(f'[format inline code] path: {path}')
root = path[: path.rfind("/")]
for suf in code_blocks:
res = re.findall(f'```{suf}\n(.*?)```', content, re.S)
res = re.findall(f"```{suf}\n(.*?)```", content, re.S)
for block in res or []:
# skip empty code block
if not block or not block.strip():
continue
if suf in ['c', 'cpp', 'java', 'go']:
file = f'{root}/Solution2.{suf}'
with open(file, 'w', encoding='utf-8') as f:
if suf in ["c", "cpp", "java", "go"]:
file = f"{root}/Solution2.{suf}"
with open(file, "w", encoding="utf-8") as f:
f.write(block)
if suf == 'go':
if suf == "go":
add_header(file)
os.system(f'gofmt -w "{file}"')
remove_header(file)
else:
os.system(f'npx clang-format -i --style=file "{file}"')
with open(file, 'r', encoding='utf-8') as f:
with open(file, "r", encoding="utf-8") as f:
new_block = f.read()
if not new_block.endswith('\n'):
new_block += '\n'
if not new_block.endswith("\n"):
new_block += "\n"
content = content.replace(block, new_block)
os.remove(file)
elif suf == 'python':
elif suf == "python":
new_block = black.format_str(
block, mode=black.FileMode(string_normalization=False)
)
content = content.replace(block, new_block)
elif suf == "sql":
for func in functions_to_replace:
pattern = r"\b{}\s*\(".format(func)
new_block = re.sub(
pattern, f"{func.upper()}(", block, flags=re.IGNORECASE
)
content = content.replace(block, new_block)
block = new_block

with open(path, 'w', encoding='utf-8') as f:
with open(path, "w", encoding="utf-8") as f:
f.write(content)


Expand All @@ -103,21 +313,21 @@ def run():

for path in paths:
add_header(path)
if any(path.endswith(suf) for suf in ['c', 'cpp', 'java']):
if any(path.endswith(suf) for suf in ["c", "cpp", "java"]):
# format with clang-format
os.system(f'npx clang-format -i --style=file "{path}"')

# format with prettier
os.system('npx prettier --write "**/*.{md,js,ts,php,sql}"')

# format with gofmt
os.system('gofmt -w .')
os.system("gofmt -w .")

for path in paths:
remove_header(path)
for path in paths:
format_inline_code(path)


if __name__ == '__main__':
if __name__ == "__main__":
run()
6 changes: 3 additions & 3 deletions solution/0100-0199/0180.Consecutive Numbers/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,16 @@ WITH
SELECT
*,
CASE
WHEN (lag(num) OVER (ORDER BY id)) = num THEN 0
WHEN (LAG(num) OVER (ORDER BY id)) = num THEN 0
ELSE 1
END AS mark
FROM Logs
),
p AS (SELECT num, sum(mark) OVER (ORDER BY id) AS gid FROM t)
p AS (SELECT num, SUM(mark) OVER (ORDER BY id) AS gid FROM t)
SELECT DISTINCT num AS ConsecutiveNums
FROM p
GROUP BY gid
HAVING count(1) >= 3;
HAVING COUNT(1) >= 3;
```

<!-- tabs:end -->
Loading